import hashlib


def generate_key(secret_key):
    """
    使用hashlib库生成一个基于密钥的哈希值作为加密密钥。
    :param secret_key: 用于生成密钥的原始密钥字符串。
    :return: 生成的哈希值。
    """
    # 使用sha256算法生成哈希值
    return hashlib.sha256(secret_key.encode()).hexdigest()


def encrypt(plain_text, secret_key):
    """
    使用生成的密钥对明文进行加密。
    :param plain_text: 需要加密的明文。
    :param secret_key: 用于加密的密钥。
    :return: 加密后的密文。
    """
    key = generate_key(secret_key)
    # 将明文转换为字节
    plain_text_bytes = plain_text.encode()
    # 将密钥转换为字节
    key_bytes = bytes.fromhex(key)  # 将哈希值转换为字节
    # 初始化密文
    cipher_text = bytearray()
    # 对明文的每个字节进行加密
    for i, byte in enumerate(plain_text_bytes):
        # 使用异或操作进行加密
        cipher_text.append(byte ^ key_bytes[i % len(key_bytes)])
    # 返回加密后的密文
    return cipher_text.hex()  # 将字节数组转换为十六进制字符串


def decrypt(cipher_text, secret_key):
    """
    使用生成的密钥对密文进行解密。
    :param cipher_text: 需要解密的密文。
    :param secret_key: 用于解密的密钥。
    :return: 解密后的明文。
    """
    key = generate_key(secret_key)
    # 将密文从十六进制字符串转换为字节
    cipher_text_bytes = bytes.fromhex(cipher_text)
    # 将密钥转换为字节
    key_bytes = bytes.fromhex(key)  # 将哈希值转换为字节
    # 初始化明文
    plain_text = bytearray()
    # 对密文的每个字节进行解密
    for i, byte in enumerate(cipher_text_bytes):
        # 使用异或操作进行解密
        plain_text.append(byte ^ key_bytes[i % len(key_bytes)])
    # 返回解密后的明文
    return plain_text.decode()


def main():
    print("请选择操作：1. 加密 2. 解密")
    choice = input("输入你的选择（1或2）：")

    if choice == '1':
        plain_text = input("请输入需要加密的内容：")
        secret_key = input("请输入口令：")
        cipher_text = encrypt(plain_text, secret_key)
        print(f"加密后的内容：{cipher_text}")
    elif choice == '2':
        cipher_text = input("请输入需要解密的内容：")
        secret_key = input("请输入口令：")
        try:
            plain_text = decrypt(cipher_text, secret_key)
            print(f"解密后的内容：{plain_text}")
        except ValueError as e:
            print(f"解密失败：{e}")
    else:
        print("无效的选择，请重新运行程序。")


if __name__ == "__main__":
    while True:
        main()
        if input('程序运行完毕！输入"x"退出，回车继续... --> ') == "x":
            break
